什么是Selenium? Selenium 是一个开源的自动化测试工具,主要用于自动化网页应用的测试。它支持多种浏览器,如Chrome、Firefox、IE等,并且兼容多种编程语言,包括Python、Java、C#等。Selenium 允许测试者编写脚本来模拟用户对网页的各种操作,例如点击、输入、滚动等,以此来验证网页的功能是否正常。
为什么要使用Selenium,使用它有什么优势?
Selenium最大的优势是能够支持多种浏览器(如Chrome、Firefox、Safari等)和多种编程语言(如Java、Python、C#等),这让它非常灵活和通用。使用 Selenium,你可以编写一套测试脚本,然后在不同的浏览器上运行相同的测试,确保你的网站或应用在各种环境中都能正常工作。此外,由于是开源软件,使用 Selenium 不需要支付费用,同时也能享受到由全球开发者和测试人员组成的庞大社区提供的丰富支持和资源。Selenium 还能方便地与其他测试框架和持续集成工具集成,使得自动化测试流程更加高效和规范。总的来说,Selenium 是自动化网页测试的强大工具,能帮助提升测试效率并保证软件质量。
安装Python,并将Python添加到环境变量
安装Pycharm社区版或企业版(两个版本在使用Selenium时,无明显区别)
安装Chrome浏览器,并下载驱动程序放在Chrome程序目录中
将Chrome目录添加到环境变量中
使用Pycharm创建项目,并在Pycharm项目中进入控制台
使用清华源来临时升级pip,然后配置默认的Python源(这里建议配置清华源)
x1# 临时使用清华源升级pip
2python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
3
4# 配置清华源为默认PyPI镜像
5python -m pip install --upgrade pip
6pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
在Pycharm控制台中,使用pip install selenium
安装Selenium模块
至此,环境搭建已经完成。
Selenium所做的一切就是发送命令(对浏览器发起操作),Selenium执行的大部分命令都是由以下的基本命令组成。
使用驱动开启会话
xxxxxxxxxx
21# 驱动会话用于打开或关闭浏览器
2driver = webdriver.Chrome()
在浏览器上执行操作
xxxxxxxxxx
21# 导航到get中的网址
2driver.get("https://www.selenium.dev/selenium/web/web-form.html")
请求浏览器信息
xxxxxxxxxx
21# 获取网页标题
2title = driver.title
建立等待策略
xxxxxxxxxx
21# 如果元素不立即可见(未加载),那这个函数会使程序进入等待状态
2driver.implicitly_wait(0.5)
发送命令查找网页元素
xxxxxxxxxx
21text_box = driver.find_element(by=By.NAME, value="my-text")
2submit_button = driver.find_element(by=By.CSS_SELECTOR, value="button")
操作元素
xxxxxxxxxx
21text_box.send_keys("Selenium")
2submit_button.click()
获取元素信息
xxxxxxxxxx
11text = message.text
结束会话
xxxxxxxxxx
41# 使用quit结束会话会关闭Chrome驱动
2driver.quit()
3# 使用close结束程序,可能会导致下一个测试程序无法正常运行
4driver.close()
ID定位
xxxxxxxxxx
161import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.baidu.com")
8# 使用ID定位到百度的搜索框,并输入字符“百度
9driver.find_element(By.ID, "kw").send_keys("必应")
10# 使用Class定位到搜索按钮,并点击
11driver.find_element(By.ID, "su").click()
12
13# 等待15秒看效果
14time.sleep(15)
15# 停止驱动程序并退出
16driver.quit()
Class定位
xxxxxxxxxx
201import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.bilibili.com")
8# 将找到的channel-link类全部打印出来
9for ele in driver.find_elements(By.CLASS_NAME, "channel-link"):
10 print("channel-link:", ele.text)
11 # 使用class定位找到第4个class属性为"channel-link",并点击
12
13# driver.find_elements(By.CLASS_NAME, "channel-link")[4].click()
14# 使用class定位找到bilibili搜索框,并输入Selenium 4
15# driver.find_element(By.CLASS_NAME, "nav-search-input").send_keys("Selenium 4")
16# 使用class定位找到搜索按钮,并点击
17# driver.find_element(By.CLASS_NAME, "nav-search-btn").click()
18# 程序停止15秒查看效果
19time.sleep(15)
20driver.quit()
Tag定位
xxxxxxxxxx
111import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.bilibili.com")
8# 当标签唯一时,使用tag_name定位更方便
9driver.find_element(By.TAG_NAME, "input").send_keys("Selenium 4")
10time.sleep(5)
11driver.quit()
Name定位
xxxxxxxxxx
111import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.baidu.com")
8# 当你定位的标签有name属性时,并且属性唯一时,就推荐使用name定位
9driver.find_element(By.NAME, "wd").send_keys("Selenium 4")
10time.sleep(3)
11driver.quit()
Link_text定位
xxxxxxxxxx
161import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.baidu.com")
8# 使用ID定位到百度的搜索框,并输入字符“百度
9driver.find_element(By.ID, "kw").send_keys("必应")
10# 使用Class定位到搜索按钮,并点击
11driver.find_element(By.ID, "su").click()
12time.sleep(2)
13# 寻找完全匹配的字符,然后点击
14driver.find_element(By.LINK_TEXT, "必应").click()
15time.sleep(3)
16driver.quit()
Partial_link_text定位
xxxxxxxxxx
161import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.get("https://www.baidu.com")
8# 使用ID定位到百度的搜索框,并输入字符“百度
9driver.find_element(By.ID, "kw").send_keys("Selenium 4")
10# 使用Class定位到搜索按钮,并点击
11driver.find_element(By.ID, "su").click()
12time.sleep(2)
13# 模糊搜索Selenium,然后点击
14driver.find_elements(By.PARTIAL_LINK_TEXT, "Selenium")[5].click()
15time.sleep(3)
16driver.quit()
Css_selector定位
xxxxxxxxxx
311import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6# 创建驱动
7driver = webdriver.Chrome()
8driver.maximize_window()
9driver.get("https://www.baidu.com")
10# 使用css的class定位
11# driver.find_element(By.CSS_SELECTOR, ".s_ipt").send_keys("python")
12# 使用css的id定位
13# driver.find_element(By.CSS_SELECTOR, "#su").click()
14# 使用那么name属性定位
15# driver.find_element(By.CSS_SELECTOR, "[name='wd']").send_keys("Selenium")
16# 模糊匹配-匹配开头
17# driver.find_element(By.CSS_SELECTOR, "a[href^='http://image.baidu.com/']").click()
18# 模糊匹配-匹配结尾
19# driver.find_element(By.CSS_SELECTOR, "a[href$='http://image.baidu.com/']").click()
20# 组合定位-
21# driver.find_element(By.CSS_SELECTOR, "input.s_ipt").send_keys("Selenium")
22# 定位子元素
23# driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a").click()
24# driver.find_element(By.CSS_SELECTOR, "#s-top-left>a").click()
25# driver.find_element(By.CSS_SELECTOR, "div.s-top-left-new.s-isindex-wrap>a").click()
26# driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a:nth-child(3)").click()
27# driver.find_elements(By.CSS_SELECTOR, "div#s-top-left>a")[3].click()
28driver.find_element(By.CSS_SELECTOR, "div#s-top-left>a:first-child").click()
29
30time.sleep(3)
31driver.quit()
定位方式 | 示例 | 描述 |
---|---|---|
通过类名 | driver.find_element_by_css_selector('.class') | 通过元素的类名选择元素。 |
通过ID | driver.find_element_by_css_selector('#id') | 通过元素的ID选择元素。 |
通过标签名 | driver.find_element_by_css_selector('tag') | 通过元素的标签名选择元素。 |
通过属性 | driver.find_element_by_css_selector('[attribute=value]') | 通过元素的属性选择元素。可以使用属性名和属性值。 |
通过子元素 | driver.find_element_by_css_selector('parent > child') | 通过父元素的子元素选择元素。可以使用直接子元素的标签名或类名。 |
通过相邻元素 | driver.find_element_by_css_selector('previous + next') | 通过元素的相邻兄弟元素选择元素。 |
通过后续元素 | driver.find_element_by_css_selector('previous ~ siblings') | 通过元素之后的兄弟元素选择元素。可以选择所有后续兄弟元素。 |
通过伪类 | driver.find_element_by_css_selector('tag:pseudo-class') | 通过元素的伪类选择元素。 |
通过伪元素 | driver.find_element_by_css_selector('tag::pseudo-element') | 通过元素的伪元素选择元素。 |
Xpath定位
xxxxxxxxxx
291待添加import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5
6driver = webdriver.Chrome()
7driver.maximize_window()
8driver.get("https://www.baidu.com")
9# 绝对路径
10# driver.find_element(By.XPATH, "/html/body/div/div/div[3]/a").click()
11# ID定位
12# driver.find_element(By.XPATH, '//input[@id="kw"]').send_keys("Selenium")
13# 根据class定位
14# driver.find_element(By.XPATH, '//input[@class="s_ipt"]').send_keys("Selenium")
15# 根据name定位
16# driver.find_element(By.XPATH, '//input[@name="wd"]')
17# 根据多个属性组合定位
18# driver.find_element(By.XPATH, '//input[@name="wd" and @class="s_ipt" and @id="kw"]').send_keys("Selenium")
19# 多组数据组合定位
20# driver.find_element(By.XPATH, '//div[@id="s-top-left"]/a[4]').click()
21# 根据子元素找父元素
22# driver.find_element(By.XPATH, '//div[@id="s-top-left"]/../div[3]').click()
23# 文本等于
24# driver.find_element(By.XPATH, '//span[text() = "习近平同匈牙利总理共同会见记者"]').click()
25# 文本包含
26driver.find_element(By.XPATH, '//a[contains(text(),"网")]').click()
27
28time.sleep(3)
29driver.quit()
x
1import time
2
3from selenium import webdriver
4from selenium.webdriver.common.by import By
5from selenium.webdriver.support.wait import WebDriverWait
6
7
8# 显式等待
9def Explicit_wait(ByType, orientation):
10 # 在事件中添加显式等待,可以有效避免找不到元素的问题
11 WebDriverWait(driver, 10).until(lambda x: x.find_element(ByType, orientation))
12
13
14# 点击事件
15def Location_click(ByType, orientation):
16 Explicit_wait(ByType, orientation)
17 driver.find_element(ByType, orientation).click()
18
19
20# 输入事件
21def Positioning_input(ByType, orientation, data):
22 Explicit_wait(ByType, orientation)
23 driver.find_element(ByType, orientation).send_keys(data)
24
25
26# 窗口最大化
27def Maximize_window():
28 driver.maximize_window()
29
30
31# 访问目标网站
32def get(url):
33 driver.get(url)
34
35
36# 创建浏览器对象
37driver = webdriver.Chrome()
38# 最大化窗口
39Maximize_window()
40
41get("https://www.xiaoofficial.asia/dt/console") # 访问目标网站,待页面全部加载完成时,再继续操作
42WebDriverWait(driver, 10).until(lambda x: x.execute_script("return document.readyState") == "complete") # 等待页面加载完成
43Positioning_input(By.ID, "loginkey1", "admin") # 输入用户名
44Positioning_input(By.ID, "loginkey2", "oracle") # 输入密码
45Location_click(By.XPATH, '//*[@id="login_card"]/div/div[2]/div[3]/div/button') # 点击登录
46Location_click(By.XPATH, '//*[@id="side-menu"]/li[2]/a/span[1]') # 点击用户管理
47Location_click(By.XPATH, '//*[@id="menu_user.user_add"]') # 点击用户新增
48Positioning_input(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[2]/div/div/div[2]/form/div[1]/div/input', 'one_login_name') # 输入登录名
49Positioning_input(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[2]/div/div/div[2]/form/div[3]/div/input', 'one-name') # 输入姓名
50Positioning_input(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[2]/div/div/div[2]/form/div[5]/div/input', 'one_number') # 输入手机号
51Positioning_input(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[2]/div/div/div[2]/form/div[7]/div/textarea', 'one_remark') # 输入备注
52Location_click(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[2]/div/div/div[2]/form/div[11]/div/button') # 点击提交
53Location_click(By.XPATH, '//*[@id="menu_user.user_setting"]') # 点击用户设置
54Location_click(By.CSS_SELECTOR, '#DataTables_Table_0 > tbody > tr:last-child > td.select-checkbox.checkbox_center.ng-scope') # 选择最后一条数据
55Location_click(By.XPATH, '//*[@id="page-wrapper"]/div[2]/div/div/div[1]/div/div/div/form/button[5]') # 点击删除
56Location_click(By.XPATH, '//*[@id="page-top"]/div[1]/div/div/div[3]/button[1]') # 点击确定
57
58
59
60time.sleep(5) # 强制停止程序5秒看效果5秒看效果
61driver, quit() # 退出
Selenium官方文档(未翻译) Selenium民间翻译文档 Selenium官网文档 Selenium官方入门指南 Selenium IDE 中文文档帮助手册教程-极客文档
Python下载地址 Pycharm企业版下载地址 Pycharm社区版下载地址 清华Python镜像站使用帮助
117以上的Chrome驱动下载地址 116版的Chrome驱动下载地址 低于116的Chrome驱动下载地址 假如:版本为 124.0.6367.61(正式版本) (64 位) 就要在117以上的Chrome驱动下载地址中下载Chrome驱动